#include "baiduai.h"

BaiduAi::BaiduAi()
{

}

QString BaiduAi::getAccessToken()
{
    //用于接收api的返回值
    QByteArray replyData;

    QString url = QString(baiduTokenUrl).arg(client_id).arg(secret_id);
    QMap<QString, QString> header;
    header.insert(QString("Content-Type"), QString("application/json"));

    // 空请求体，因为token请求不需要请求体数据
    QByteArray requestData;

    bool result = BaiduAi::post_sync(url, header, requestData, replyData);

    if(result)
    {
        QJsonObject obj = QJsonDocument::fromJson(replyData).object();
        return obj.value("access_token").toString();
    }

    return QString();
}

/**
 * @brief 发送同步HTTP POST请求到指定的API端点
 * @param url API的完整请求地址（例如：百度人脸搜索的URL）
 * @param header HTTP请求头（需包含Content-Type、Authorization等字段）
 * @param requestData 请求体数据（JSON格式或二进制数据，需与API文档要求一致）
 * @param[out] replyData 用于存储API返回的响应数据（JSON或二进制）
 * @return true 请求成功且服务器返回有效数据；false 请求失败或网络错误
 * @note
 * - 此函数是同步阻塞的，会等待请求完成后再返回。
 * - 对于百度AI的API，通常需要在header中传递`Content-Type: application/json`。
 * - 错误处理需结合`QNetworkReply::error()`和API返回的错误码（如百度AI的`error_code`字段）。
 */
bool BaiduAi::post_sync(QString url, QMap<QString, QString>header, QByteArray requestData, QByteArray&replyData)
{
    QNetworkAccessManager manager;  //发送请求的动作
    QNetworkRequest request;    //请求的内容(包含url和头)
    request.setUrl(url);

    QMapIterator<QString, QString> it(header);
    while (it.hasNext())
    {
        it.next();
        request.setRawHeader(it.key().toLatin1(),  it.value().toLatin1());

    }

    //发起请求
    QNetworkReply *reply =  manager.post(request, requestData);
    QEventLoop l;
    QObject::connect(reply, &QNetworkReply::finished, &l, &QEventLoop::quit);
    l.exec();
    if(reply!= nullptr && reply->error() == QNetworkReply::NoError)
    {
        replyData = reply->readAll();
        return true;
    }
    else
    {
        return false;
    }
}

QByteArray BaiduAi::ImageToBase64(QString imgPath)
{
    QFile file(imgPath);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "Failed to open image file:" << imgPath;
        return QByteArray();
    }

    QByteArray imageData = file.readAll();
    file.close();

    return imageData.toBase64();
}
